﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Com.Binaria.Core;
using Com.Binaria.Core.Enumeracion;
using Com.Binaria.Core.Exceptions;
using Com.Binaria.SISCOB.DTO;
using Com.Binaria.SISCOB.Dom;
using Com.Binaria.SISCOB.Funcional.DTO;

namespace Com.Binaria.SISCOB.Mgr
{

    public class RegistroContableMgr : IRegistroContableMgr
    {
        #region ATRIBUTOS A EXPONER AL USUARIO
        public IRegistroContableDom iRegistroContableDom;
        #endregion

        #region Miembros de IRegistroContableMgr
        public RegistroContableFuncionalDTO GetById(ContextoDTO oContexto, System.Int32? Id)
        {
            RegistroContableFuncionalDTO oItem = null;
            //
            try
            {
                RegistroContableDTO tmp = iRegistroContableDom.BuscarRegistroContablePorId(oContexto, Id);
                if (tmp != null)
                {
                    oItem = new RegistroContableFuncionalDTO();
                    oItem.Id = tmp.Id;
                    oItem.FchRegistro = tmp.FchRegistro;
                    oItem.Glosa = tmp.Glosa;
                    oItem.Monto = Convert.ToInt64(tmp.Monto);
                    oItem.Tipo = tmp.Tipo;
                    oItem.NmrDcto = tmp.NmrDcto;
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public IList<RegistroContableFuncionalDTO> GetAll(ContextoDTO oContexto)
        {
            IList<RegistroContableFuncionalDTO> oItem = null;
            //
            try
            {
                IList<RegistroContableDTO> tmp = iRegistroContableDom.BuscarRegistroContableTodos(oContexto);
                if (tmp != null)
                {
                    oItem = new List<RegistroContableFuncionalDTO>(tmp.Count);
                    for (int i = 0; i < tmp.Count; i++)
                    {
                        RegistroContableFuncionalDTO oFDto = new RegistroContableFuncionalDTO();
                        oFDto.Id = tmp[i].Id;
                        oFDto.FchRegistro = tmp[i].FchRegistro;
                        oFDto.Glosa = tmp[i].Glosa;
                        oFDto.Monto = Convert.ToInt64(tmp[i].Monto);
                        oFDto.Tipo = tmp[i].Tipo;
                        oFDto.NmrDcto = tmp[i].NmrDcto;
                        //
                        oItem.Add(oFDto);
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public IList<RegistroContableFuncionalDTO> GetBy(ContextoDTO oContexto, RegistroContableFuncionalDTO item)
        {
            IList<RegistroContableFuncionalDTO> oItem = null;
            //
            try
            {
                IList<RegistroContableDTO> tmp = null;
                if (item == null)
                    tmp = iRegistroContableDom.BuscarRegistroContableTodos(oContexto);
                else
                {
                    RegistroContableDTO oDto = new RegistroContableDTO();
                    oDto.Id = item.Id;
                    oDto.FchRegistro = item.FchRegistro;
                    if (item.Monto > 0) oDto.Monto = item.Monto;
                    if (!string.IsNullOrEmpty(item.Tipo)) oDto.Tipo = item.Tipo;
                    if (!string.IsNullOrEmpty(item.NmrDcto)) oDto.NmrDcto = item.NmrDcto;
                    //
                    tmp = iRegistroContableDom.BuscarRegistroContableFiltro(oContexto, oDto);
                }

                if (tmp != null)
                {
                    oItem = new List<RegistroContableFuncionalDTO>(tmp.Count);
                    for (int i = 0; i < tmp.Count; i++)
                    {
                        RegistroContableFuncionalDTO oFDto = new RegistroContableFuncionalDTO();
                        oFDto.Id = tmp[i].Id;
                        oFDto.FchRegistro = tmp[i].FchRegistro;
                        oFDto.Glosa = tmp[i].Glosa;
                        oFDto.Monto = Convert.ToInt64(tmp[i].Monto);
                        oFDto.Tipo = tmp[i].Tipo;
                        oFDto.NmrDcto = tmp[i].NmrDcto;
                        //
                        oItem.Add(oFDto);
                    }
                }
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return oItem;
        }

        public bool Save(ContextoDTO oContexto, RegistroContableFuncionalDTO item)
        {
            bool IsOK = false;
            bool IsExist = (item.Id.HasValue && item.Id > 0);

            try
            {

                RegistroContableDTO oDto = new RegistroContableDTO();
                oDto.Id = item.Id;
                oDto.FchRegistro = item.FchRegistro;
                oDto.Glosa = item.Glosa;
                oDto.Monto = item.Monto;
                oDto.Tipo = item.Tipo;
                oDto.NmrDcto = item.NmrDcto;

                if (IsExist)
                    iRegistroContableDom.RegistrarRegistroContable(oContexto, new List<RegistroContableDTO>() { oDto }, EnumRegistrarAccion.Modificar);
                else
                    iRegistroContableDom.RegistrarRegistroContable(oContexto, new List<RegistroContableDTO>() { oDto }, EnumRegistrarAccion.Agregar);

                IsOK = true;
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return IsOK;
        }

        public bool Delete(ContextoDTO oContexto, RegistroContableFuncionalDTO item)
        {
            bool IsOK = false;
            bool IsExist = (item.Id.HasValue && item.Id > 0);

            try
            {
                RegistroContableDTO oDto = new RegistroContableDTO();
                oDto.Id = item.Id;
                
                if (IsExist)
                {
                    iRegistroContableDom.RegistrarRegistroContable(oContexto, new List<RegistroContableDTO>() { oDto }, EnumRegistrarAccion.Eliminar);
                }
                IsOK = true;
            }
            catch (Exception ex) { throw new ManagerException(ex.Message, System.Diagnostics.TraceEventType.Warning); }
            return IsOK;
        }
        #endregion
    }
}
